//
// Created by LiuYou on 2021/5/20.
//

#include <cstdlib>
#include <unistd.h>
#include <cstdio>
#include <sys/wait.h>
#include <cstring>
#include <glob.h>


class Cmd {
public:
    glob_t globRes;
};

static void printPrompt();

static void parse(char* line, Cmd* res);

/*
 * TODO 注意: 一定要包正确头文件, 因为可能会产生段错误等等错误。
 */
int main() {
    char* lineBuf = nullptr;
    size_t lineBufSize{};
    Cmd cmd{};
    for (;;) {
        // 打印提示符
        // printPrompt()
        printPrompt();
        // 获得输入的内容
        // getline()
        if (getline(&lineBuf, &lineBufSize, stdin) < 0) {
//            std::perror("getline()");
//            std::exit(1);
            break;
        }
        // 解析输入的内容
        // parse()
        parse(lineBuf, &cmd);
        /*
         * 如果是内部命令;
         * 如果是外部命令;
         */
        if (0) {
            // 如果是内部命令 (先不实现这里)

        } else {
            // 如果是外部命令
            // fork()
            pid_t pid = fork();
            if (pid < 0) {
                std::perror("fork()");
                std::exit(1);
            } else if (pid == 0) {
//                execX
                execvp(cmd.globRes.gl_pathv[0], cmd.globRes.gl_pathv);
                std::perror("execvp()");
                std::exit(1);
            } else {
                wait(nullptr);
            }
        }


    }

    std::exit(0);
}

static void parse(char* line, Cmd* res) {
    const char* delimiter = " \t\n";
    char* string = nullptr;
    // TODO 注意: 这里的 i 设计很妙, 但是我现在不懂。
    int i = 0;
    for (;;) {
        string = strsep(&line, delimiter);
        if (string == nullptr) {
            break;
        }
        if (string[0] == '\0') {
            continue;
        }
        glob(string, GLOB_NOCHECK | GLOB_APPEND * i, nullptr, &res->globRes);
        i = 1;
    }

}

static void printPrompt() {
    std::printf("MyShell-0.1$ ");

}
